package com.zjl.redis.第02章_十大数据类型;

import com.zjl.redis.第01章_redis安装.RedisUtil;
import com.zjl.redis.第14章_大数据统计.B1_GEO详解;
import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Redis GEO主要用于存储地理位置信息，并对存储的信息进行操作，
 * 包括
 *      添加地理位置的坐标。
 *      获取地理位置的坐标。
 *      计算两个位置之间的距离。
 *      根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
 */
public class B6_GEO {
    /**
     * GEO 经纬度   地秤是 zset类型
     * Redis 3.2中增加了对GEO类型的支持。GEO , Geographic ,地理信息的缩写。
     * 该类型,就是元素的2维坐标，在地图上就是经纬度。redis 基于该类型,提供了经纬
     * 度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。。
     *
     * 两极无法直接添加,一般会下载城市数据，直接通过Java程序一次性导入。
     * 有效的经度从-180度到180度。有效的纬度从-85.05112878 度到 85.05112878度。
     * 当坐标位置超出指定范围时，该命令将会返回一个错误。
     *      已经添加的数据,是无法再次往里面添加的。
     *
     * geoadd key 经度1 纬度1 member1  经度2 纬度2 member2//在key里存经纬度和这个经纬度的备注
     * geopos key member//返回key这个建的member对应的经纬度
     * geodist key member1 member2 m/km/ft/mi   //计算key的 member1和member1的距离
     *            m:米         km:千米     mi:英里       ft:英尺
     * georadius key 经度 纬度 距离 单位//以给定的经纬度为中心  距离为半径  返回在key里包含的member
     * georadiusbymember key member 距离 单位//以给定的member为中心  距离为半径  返回在key里包含的member
     * geohash key member1 member2//返回key的member1的哈希值
     *
     * @see B1_GEO详解
     *
     */
    public static void main(String[] args) {

        Jedis jedis = RedisUtil.getRedis();
        System.currentTimeMillis();//获取当前时间戳
        System.out.println(jedis.ping());//查看是否连接成功  PONG:成功
        GeoCoordinate geoCoordinate = new GeoCoordinate(15.6,167.5);//经纬线
        Map<String,GeoCoordinate> m = new HashMap<>();
        m.put("地点1",geoCoordinate);//名称 + 经纬线地点
        jedis.geoadd("city",m);

        List<String> city = jedis.zrange("city", 0, -1);

        System.out.println(city);

        jedis.close();
    }
}
